package com.lianyu.wangyiyun.utils;

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

import androidx.annotation.Nullable;

import com.lianyu.wangyiyun.model.Mp3Info;

import java.util.ArrayList;
import java.util.List;

/**
 * @author Chen Yuguang
 * @date 2021/5/20 6:47
 */
public class HistoryHelper extends SQLiteOpenHelper {
    private static final String TAG = "HistoryHelper";
    /**
     * 库名
     */
    private static final String DATABASE_NAME = "history";
    /**
     * 库版本
     */
    private static final int DATABASE_VERSION = 1;
    /**
     * 表名
     */
    public static final String TABLE_NAME = "history";
    /**
     * 歌曲id
     */
    public static final String COLUMN_NAME_ID = "id";
    /**
     * 歌名
     */
    public static final String COLUMN_NAME_TITLE = "title";
    /**
     * 歌手
     */
    public static final String COLUMN_NAME_ARTIST = "artist";
    /**
     * 歌曲url（路径或网址）
     */
    public static final String COLUMN_NAME_URL = "url";
    /**
     * 专辑url（路径或网址）
     */
    public static final String COLUMN_NAME_ALBUM = "album";
    /**
     * 播放时间(用于排序)
     */
    public static final String COLUMN_NAME_TIME = "time";

    private static HistoryHelper historyHelper;

    private HistoryHelper(@Nullable Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    /**
     * 初始化历史记录储存库帮助库
     *
     * @param context 内容
     * @author Chen Yuguang
     * @date 2021/5/21 5:07
     */
    public static void initHelper(Context context) {
        if (historyHelper == null) {
            historyHelper = new HistoryHelper(context);
        }
    }

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        // 第一次创建数据库的时候可以通过 SQLiteDatabase 来创建表
        String sqlCreateEntry = "CREATE TABLE IF NOT EXISTS " + TABLE_NAME + " (" +
                COLUMN_NAME_ID + " INTEGER PRIMARY KEY, " +
                COLUMN_NAME_TITLE + " VARCHAR(50), " +
                COLUMN_NAME_ARTIST + " VARCHAR(50), " +
                COLUMN_NAME_URL + " VARCHAR(100), " +
                COLUMN_NAME_ALBUM + " VARCHAR(100)," +
                COLUMN_NAME_TIME + " INTEGER " +
                ")";
        sqLiteDatabase.execSQL(sqlCreateEntry);
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) {
        // 通过 SQLiteDatabase 对数据库进行需改（对表添加字段，或者添加新表）
        String sqlDeleteEntry = "DROP TABLE IF EXISTS " + TABLE_NAME;
        sqLiteDatabase.execSQL(sqlDeleteEntry);
        onCreate(sqLiteDatabase);
    }

    /**
     * 写入一条播放历史
     *
     * @param mp3Info 音乐信息类
     * @author Chen Yuguang
     * @date 2021/5/21 5:09
     */
    public static void writeHistory(Mp3Info mp3Info) {
        // 通过SQLiteOpenHelper获取到 db 对象
        SQLiteDatabase sqLiteDatabase = historyHelper.getWritableDatabase();
        // 第一个参数是 要查询的表名
        // 第二个参数是 要读取表中的哪些字段
        // 第三个参数是条件相关的语句 ? 是占位符, 第四个参数是占位符中对应的值
        // cursor 是这个操作返回的结果，游标对象，可以通过这个对象来获取结果集
        long id = mp3Info.getId();
        Cursor cursor = sqLiteDatabase.query(TABLE_NAME,
                new String[]{COLUMN_NAME_ID},
                "id=?", new String[]{String.valueOf(id)}, null, null, null);
        if (cursor.getCount() == 0) {
            // sqLiteDatabase 对象通过 insert 来插入一条数据(ContentValues对象)到数据库中，result是在数据库中新增数据库的行id
            long result = sqLiteDatabase.insert(TABLE_NAME, null, mp3Info.toContentValues());
            if (result == -1) {
                Log.e(TAG, "插入数据错误");
            }
        } else {
            // sqLiteDatabase 对象通过 insert 来插入一条数据(ContentValues对象)到数据库中，result是在数据库中新增数据库的行id
            long result = sqLiteDatabase.update(TABLE_NAME, mp3Info.toContentValues(), "id=?", new String[]{String.valueOf(id)});
            if (result == 0) {
                Log.e(TAG, "更新数据错误");
            }
        }
        cursor.close();
        sqLiteDatabase.close();
    }

    /**
     * 读取播放历史
     *
     * @return java.util.List<com.lianyu.wangyiyun.model.Mp3Info>
     * @author Chen Yuguang
     * @date 2021/5/21 5:09
     */
    public static List<Mp3Info> readHistory() {
        // 通过SQLiteOpenHelper获取到 db 对象
        SQLiteDatabase sqLiteDatabase = historyHelper.getReadableDatabase();
        // 第一个参数是 要查询的表名
        // 第二个参数是 要读取表中的哪些字段
        // 第三个参数是条件相关的语句 ? 是占位符, 第四个参数是占位符中对应的值
        // cursor 是这个操作返回的结果，游标对象，可以通过这个对象来获取结果集
        Cursor cursor = sqLiteDatabase.query(TABLE_NAME,
                new String[]{COLUMN_NAME_ID, COLUMN_NAME_TITLE, COLUMN_NAME_ARTIST, COLUMN_NAME_URL, COLUMN_NAME_ALBUM},
                null, null, null, null, COLUMN_NAME_TIME + " DESC");
        List<Mp3Info> mp3Infos = new ArrayList<>();
        // 这里是游标的使用方式
        while (cursor.moveToNext()) {
            Mp3Info mp3Info = new Mp3Info();
            mp3Info.setId(cursor.getLong(0));
            mp3Info.setTitle(cursor.getString(1));
            mp3Info.setArtist(cursor.getString(2));
            mp3Info.setUrl(cursor.getString(3));
            mp3Info.setAlbum(cursor.getString(4));
            mp3Infos.add(mp3Info);
        }
        cursor.close();
        sqLiteDatabase.close();
        return mp3Infos;
    }

    public static void deleteHistory(long id) {
        // 通过SQLiteOpenHelper获取到 db 对象
        SQLiteDatabase sqLiteDatabase = historyHelper.getWritableDatabase();
        // 调用delete 根据相关条件来删除数据库中的数据
        // 第二个参数是条件相关的语句 ? 是占位符, 第三个参数是占位符中对应的值
        // result 是这个操作所影响的数据条数
        int result = sqLiteDatabase.delete(TABLE_NAME, "id=?", new String[]{String.valueOf(id)});
        if (result == 0) {
            Log.e(TAG, "删除数据错误");
        }
        sqLiteDatabase.close();
    }

    public static void emptyHistory() {
        // 通过SQLiteOpenHelper获取到 db 对象
        SQLiteDatabase sqLiteDatabase = historyHelper.getWritableDatabase();
        // 调用delete 根据相关条件来删除数据库中的数据
        // 第二个参数是条件相关的语句 ? 是占位符, 第三个参数是占位符中对应的值
        // result 是这个操作所影响的数据条数
        int result = sqLiteDatabase.delete(TABLE_NAME, null, null);
        if (result == 0) {
            Log.e(TAG, "清空表错误");
        }
        sqLiteDatabase.close();
    }

}
